#include <QColorDialog>
#include <QEvent>
#include <QInputDialog>
#include <QKeyEvent>
#include <QMessageBox>
#include "MainWindow.h"
#include "ui_MainWindow.h"

/**
 * 构造方法。
 * @param parent    父窗口
 */
MainWindow::MainWindow(QWidget* parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    mGameBoard(this, 0, 0, Const::GAME_BOARD_WIDTH, Const::GAME_BOARD_HEIGHT),
    mGame(mGameBoard.getBitmap(), &mGameBoard) {
    ui->setupUi(this);

    // 设置状态栏
    int labelWidth = QMainWindow::width() / Const::STATUS_BAR_PART_COUNT;
    ui->statusBar->addWidget(&mLabelDifficulty, labelWidth);
    ui->statusBar->addWidget(&mLabelScore, labelWidth);
    mLabelDifficulty.setText(tr("IDS_DIFFICULTY"));
    mLabelScore.setText(tr("IDS_SCORE"));

    // 安装事件过滤器
    QMainWindow::installEventFilter(this);

    // 连接信号与槽
    QMainWindow::connect(&mGame, SIGNAL(UM_DIFFICULTY_UP(int)), this, SLOT(onDifficultyUp(int)));
    QMainWindow::connect(&mGame, SIGNAL(UM_GAME_OVER(bool)), this, SLOT(onGameOver(bool)));
    QMainWindow::connect(&mGame, SIGNAL(UM_SCORE(int)), this, SLOT(onScore(int)));
}

/**
 * 析构方法。
 */
MainWindow::~MainWindow() {
    delete ui;
}

/**
 * 事件过滤。
 * @param watched   产生事件的对象
 * @param e         事件相关信息
 * @return 事件在此被处理则返回 true，否则返回 false
 */
bool MainWindow::eventFilter(QObject* watched, QEvent* e) {
    if (watched != this) {
        return false;
    }

    if (e->type() == QEvent::Show) {
        // 游戏区域的 Y 坐标要设置为工具栏的高度，这样游戏区域就在工具栏的下方了
        mGameBoard.move(0, ui->mainToolBar->height());
        return true;
    }

    Game::Status status = mGame.getStatus();
    if (status == Game::PLAYING && e->type() == QEvent::WindowDeactivate) {
        this->on_buttonPause_triggered();
        return true;
    }

    return false;
}

/**
 * 按键事件的响应方法。
 * @param e 事件相关信息
 */
void MainWindow::keyPressEvent(QKeyEvent* e) {
    mGame.onKeyPressed(e->key());
}

/**
 * "帮助"按钮的单击响应方法。
 */
void MainWindow::on_buttonHelp_triggered() {
    QMessageBox::information(this, " ", tr("IDS_HELP_TEXT"));
}

/**
 * "播放音乐"按钮的单击响应方法。
 */
void MainWindow::on_buttonMusic_triggered() {
    bool playingMusic = mGame.playMusic();
    ui->buttonMusic->setChecked(playingMusic);
}

/**
 * "暂停"按钮的单击响应方法。
 */
void MainWindow::on_buttonPause_triggered() {
    mGame.pause();
    ui->buttonPause->setChecked(mGame.getStatus() == Game::PAUSED);
}

/**
 * "开始"按钮的单击响应方法。
 */
void MainWindow::on_buttonStart_triggered() {
    // 游戏开始
    mGame.start();

    // 设置按钮状态
    ui->buttonPause->setEnabled(true);
    ui->buttonPause->setChecked(false);

    // 设置状态栏上的文字
    QString text = tr("IDS_DIFFICULTY") + QString::number(1);
    mLabelDifficulty.setText(text);
    text = tr("IDS_SCORE") + QString::number(0) ;
    mLabelScore.setText(text);
}

/**
 * 难度增加事件的响应方法。
 * @param difficulty    难度
 */
void MainWindow::onDifficultyUp(int difficulty) {
    QString text = tr("IDS_DIFFICULTY") + QString::number(difficulty);
    mLabelDifficulty.setText(text);
}

/**
 * 游戏结束事件的响应方法。
 * @param isWon 胜利则为 true，否则为 false
 */
void MainWindow::onGameOver(bool isWon) {
    if (isWon) {
        QMessageBox::information(this, " ", tr("IDS_WON"));
    } else {
        QMessageBox::information(this, " ", tr("IDS_LOST"));
    }

    ui->buttonPause->setChecked(false);
    ui->buttonPause->setEnabled(false);
}

/**
 * 得分事件的响应方法。
 * @param score 得分
 */
void MainWindow::onScore(int score) {
    QString text = tr("IDS_SCORE") + QString::number(score);
    mLabelScore.setText(text);
}
